package com.ymjspace.util;

import org.springframework.stereotype.Component;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @Description 日期处理工具类：包含日期数据的各种处理
 * @Author YMJ
 * @DateTime 2020-10-13 21:52
 * @Version V1.0.0
 */
@Component
public class YMJDateTimeUtil {
    /*======================将日期对象格式化为日期字符串=====================================*/
    /**
     * 将日期对象格式化为 "pattern" 格式的字符串
     * @param date 日期对象
     * @param pattern 目标日期格式
     * @return 格式化的日期字符串
     */
    public String formatDateToStr(Date date, String pattern){
        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
        String formatedDateStr = sdf.format(date);
        return formatedDateStr;
    }

    /**
     * 将日期对象格式化为 "yyyy-MM-dd HH:mm:ss" 格式的字符串
     * @param date 日期对象
     * @return 格式化的日期字符串
     */
    public String formatDateToStr_YMDHMS1(Date date){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String formatedDateStr = sdf.format(date);
        return formatedDateStr;
    }

    /**
     * 将日期对象格式化为 "yyyy年MM月dd日 HH时mm分ss秒" 格式的字符串
     * @param date 日期对象
     * @return 格式化的日期字符串
     */
    public String formatDateToStr_YMDHMS2(Date date){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
        String formatedDateStr = sdf.format(date);
        return formatedDateStr;
    }

    /**
     * 将日期对象格式化为 "yyyy/MM/dd HH:mm:ss" 格式的字符串
     * @param date 日期对象
     * @return 格式化的日期字符串
     */
    public String formatDateToStr_YMDHMS3(Date date){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        String formatedDateStr = sdf.format(date);
        return formatedDateStr;
    }

    /**
     * 将日期对象格式化为 "yyyyMMddHHmmss" 格式的字符串
     * @param date 日期对象
     * @return 格式化的日期字符串
     */
    public String formatDateToStr_YMDHMS4(Date date){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        String formatedDateStr = sdf.format(date);
        return formatedDateStr;
    }

    /**
     * 将日期对象格式化为 "yyyy-MM-dd" 格式的字符串
     * @param date 日期对象
     * @return 格式化的日期字符串
     */
    public String formatDateToStr_YMD1(Date date){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String formatedDateStr = sdf.format(date);
        return formatedDateStr;
    }

    /**
     * 将日期对象格式化为 "yyyy年MM月dd日" 格式的字符串
     * @param date 日期对象
     * @return 格式化的日期字符串
     */
    public String formatDateToStr_YMD2(Date date){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
        String formatedDateStr = sdf.format(date);
        return formatedDateStr;
    }

    /**
     * 将日期对象格式化为 "yyyy/MM/dd" 格式字符串
     * @param date 日期对象
     * @return 格式化的日期字符串
     */
    public String formatDateToStr_YMD3(Date date){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
        String formatedDateStr = sdf.format(date);
        return formatedDateStr;
    }

    /**
     * 将日期对象格式化为 "yyyyMMdd" 格式的字符串
     * @param date 日期对象
     * @return 格式化的日期字符串
     */
    public String formatDateToStr_YMD4(Date date){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        String formatedDateStr = sdf.format(date);
        return formatedDateStr;
    }

    /**
     * 将日期对象格式化为 "HH:mm:ss" 格式的字符串
     * @param date 日期对象
     * @return 格式化的日期字符串
     */
    public String formatDateToStr_HMS1(Date date){
        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
        String formatedDateStr = sdf.format(date);
        return formatedDateStr;
    }

    /**
     * 将日期对象格式化为 "HH时mm分ss秒" 格式的字符串
     * @param date 日期对象
     * @return 格式化的日期字符串
     */
    public String formatDateToStr_HMS2(Date date){
        SimpleDateFormat sdf = new SimpleDateFormat("HH时mm分ss秒");
        String formatedDateStr = sdf.format(date);
        return formatedDateStr;
    }

    /**
     * 将日期对象格式化为 "HH/mm/ss" 格式的字符串
     * @param date 日期对象
     * @return 格式化的日期字符串
     */
    public String formatDateToStr_HMS3(Date date){
        SimpleDateFormat sdf = new SimpleDateFormat("HH/mm/ss");
        String formatedDateStr = sdf.format(date);
        return formatedDateStr;
    }

    /**
     * 将日期对象格式化为 "HHmmss" 格式的字符串
     * @param date 日期对象
     * @return 格式化的日期字符串
     */
    public String formatDateToStr_HMS4(Date date){
        SimpleDateFormat sdf = new SimpleDateFormat("HHmmss");
        String formatedDateStr = sdf.format(date);
        return formatedDateStr;
    }

    /*======================将日期字符串格式化为日期对象=====================================*/
    /**
     * 将格式为 "pattern" 日期字符串解析为日期对象
     * @param dateStr 日期字符串
     * @param pattern 日期格式
     * @return 解析后的日期对象
     */
    public Date parseDateStrToDate(String dateStr, String pattern) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
        Date parsedDate = sdf.parse(dateStr);
        return parsedDate;
    }

    /**
     * 将格式为 "yyyy-MM-dd HH:mm:ss" 日期字符串解析为日期对象
     * @param dateStr 日期字符串
     * @return 解析后的日期对象
     */
    public Date parseDateStrToDate_YMDHMS1(String dateStr) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date parsedDate = sdf.parse(dateStr);
        return parsedDate;
    }

    /**
     * 将格式为 "yyyy年MM月dd日 HH时mm分ss秒" 日期字符串解析为日期对象
     * @param dateStr 日期对象
     * @return 解析后的日期对象
     */
    public Date parseDateStrToDate_YMDHMS2(String dateStr) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
        Date parsedDate = sdf.parse(dateStr);
        return parsedDate;
    }

    /**
     * 将格式为 "yyyy/MM/dd HH:mm:ss" 日期字符串解析为日期对象
     * @param dateStr 日期对象
     * @return 解析后的日期对象
     */
    public Date parseDateStrToDate_YMDHMS3(String dateStr) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        Date parsedDate = sdf.parse(dateStr);
        return parsedDate;
    }

    /**
     * 将格式为 "yyyy/MM/dd HH:mm:ss" 日期字符串解析为日期对象
     * @param dateStr 日期对象
     * @return 解析后的日期对象
     */
    public Date parseDateStrToDate_YMDHMS4(String dateStr) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        Date parsedDate = sdf.parse(dateStr);
        return parsedDate;
    }

    /**
     * 将格式为 "yyyy-MM-dd" 日期字符串解析为日期对象
     * @param dateStr 日期对象
     * @return 解析后的日期对象
     */
    public Date parseDateStrToDate_YMD1(String dateStr) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date parsedDate = sdf.parse(dateStr);
        return parsedDate;
    }

    /**
     * 将格式为 "yyyy年MM月dd日" 日期字符串解析为日期对象
     * @param dateStr 日期对象
     * @return 解析后的日期对象
     */
    public Date parseDateStrToDate_YMD2(String dateStr) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
        Date parsedDate = sdf.parse(dateStr);
        return parsedDate;
    }

    /**
     * 将格式为 "yyyy年MM月dd日" 日期字符串解析为日期对象
     * @param dateStr 日期对象
     * @return 解析后的日期对象
     */
    public Date parseDateStrToDate_YMD3(String dateStr) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
        Date parsedDate = sdf.parse(dateStr);
        return parsedDate;
    }

    /**
     * 将格式为 "yyyy年MM月dd日" 日期字符串解析为日期对象
     * @param dateStr 日期对象
     * @return 解析后的日期对象
     */
    public Date parseDateStrToDate_YMD4(String dateStr) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        Date parsedDate = sdf.parse(dateStr);
        return parsedDate;
    }

    /**
     * 将格式为 "HH:mm:ss" 日期字符串解析为日期对象
     * @param dateStr 日期对象
     * @return 解析后的日期对象
     */
    public Date parseDateStrToDate_HMS1(String dateStr) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
        Date parsedDate = sdf.parse(dateStr);
        return parsedDate;
    }

    /**
     * 将格式为 "HH时mm分ss秒" 日期字符串解析为日期对象
     * @param dateStr 日期对象
     * @return 解析后的日期对象
     */
    public Date parseDateStrToDate_HMS2(String dateStr) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("HH时mm分ss秒");
        Date parsedDate = sdf.parse(dateStr);
        return parsedDate;
    }

    /**
     * 将格式为 "HHmmss" 日期字符串解析为日期对象
     * @param dateStr 日期对象
     * @return 解析后的日期对象
     */
    public Date parseDateStrToDate_HMS3(String dateStr) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("HHmmss");
        Date parsedDate = sdf.parse(dateStr);
        return parsedDate;
    }

    /**
     * 比较两个日期对象的大小
     * @param date1 第一个日期
     * @param date2 第二个日期
     * @return 0：两个日期相等 >0:第一个日期大于第二个日期 <0:第一个日期小于第二个日期
     */
    public int compareDate(Date date1,Date date2){
        return date1.compareTo(date2);
    }

    /**
     * 计算两个日期对象相差的毫秒数
     * @param date1 第一个日期
     * @param date2 第二个日期
     * @return 两日期相差的时间戳(毫秒)
     */
    public Long compareTwoDate(Date date1, Date date2){
        Long date1Timestamp = date1.getTime();
        Long date2Timestamp = date2.getTime();
        Long timeDifference = Math.abs(date1Timestamp - date2Timestamp);
        return timeDifference;
    }

    /**
     * 计算两个日期对象相差的秒数
     * @param date1 第一个日期
     * @param date2 第二个日期
     * @return 两日期相差的秒数
     */
    public Long compareTwoDateTimeDifferenceSecond(Date date1, Date date2){
        Long timeDifference = compareTwoDate(date1, date2);
        Long timeDifferenceSecond = timeDifference/1000;
        return timeDifferenceSecond;
    }

    /**
     * 计算两个日期对象相差的分钟数
     * @param date1 第一个日期
     * @param date2 第二个日期
     * @return 两日期相差的分钟数
     */
    public Long compareTwoDateTimeDifferenceMinute(Date date1, Date date2){
        Long timeDifference = compareTwoDate(date1, date2);
        Long timeDifferenceMinute = timeDifference/1000/60;
        return timeDifferenceMinute;
    }

    /**
     * 计算两个日期对象相差的小时数
     * @param date1 第一个日期
     * @param date2 第二个日期
     * @return 两日期相差的小时数
     */
    public Long compareTwoDateTimeDifferenceHour(Date date1, Date date2){
        Long timeDifference = compareTwoDate(date1, date2);
        Long timeDifferenceHour = timeDifference/1000/60/60;
        return timeDifferenceHour;
    }

    /**
     * 计算两个日期对象相差的天数
     * @param date1 第一个日期
     * @param date2 第二个日期
     * @return 两日期相差的天数
     */
    public Long compareTwoDateTimeDifferenceDay(Date date1, Date date2){
        Long timeDifference = compareTwoDate(date1, date2);
        Long timeDifferenceDay = timeDifference/1000/60/60/24;
        return timeDifferenceDay;
    }

    /**
     * 计算两个日期对象相差的月数
     * @param date1 第一个日期
     * @param date2 第二个日期
     * @return 两日期相差的月数
     */
    public Long compareTwoDateTimeDifferenceMonth(Date date1, Date date2){
        Long timeDifference = compareTwoDate(date1, date2);
        /*粗略把每个月算为30天*/
        Long timeDifferenceMonth = timeDifference/1000/60/60/24/30;
        return timeDifferenceMonth;
    }

    /**
     * 计算两个日期对象相差的年数
     * @param date1 第一个日期
     * @param date2 第二个日期
     * @return 两日期相差的年数
     */
    public Long compareTwoDateTimeDifferenceYear(Date date1, Date date2){
        Long timeDifference = compareTwoDate(date1, date2);
        /*粗略把每个月算为30天*/
        Long timeDifferenceYear = timeDifference/1000/60/60/24/30/12;
        return timeDifferenceYear;
    }
}
